Add portal version checking helper
authorBastien Nocera <hadess@hadess.net>
Mon, 23 Mar 2020 13:56:43 +0000 (14:56 +0100)
committerBastien Nocera <hadess@hadess.net>
Mon, 30 Mar 2020 16:31:23 +0000 (18:31 +0200)
Add gtk_get_portal_interface_version() to check the version of a portal.

gtk/gtkprivate.c
gtk/gtkprivate.h

index 8de1e81a5e8b23ff95642570811e32e21544603e..9a6cd584dc5691c2caf4b5c3cd9a49cbe0b0cffb 100644 (file)
@@ -268,6 +268,63 @@ _gtk_ensure_resources (void)
   g_once (&register_resources_once, register_resources, NULL);
 }
 
+/*
+ * gtk_get_portal_interface_version:
+ * @connection: a session #GDBusConnection
+ * @interface_name: the interface name for the portal interface
+ *   we're interested in.
+ *
+ * Returns: the version number of the portal, or 0 on error.
+ */
+guint
+gtk_get_portal_interface_version (GDBusConnection *connection,
+                                  const char      *interface_name)
+{
+  GDBusProxy *proxy = NULL;
+  GError *error = NULL;
+  GVariant *ret = NULL;
+  char *owner = NULL;
+  guint version = 0;
+
+  proxy = g_dbus_proxy_new_sync (connection,
+                                 0,
+                                 NULL,
+                                 "org.freedesktop.portal.Desktop",
+                                 "/org/freedesktop/portal/desktop",
+                                 interface_name,
+                                 NULL,
+                                 &error);
+  if (!proxy)
+    {
+      if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        g_warning ("Could not query portal version on interface '%s': %s",
+                   interface_name, error->message);
+      goto out;
+    }
+
+  owner = g_dbus_proxy_get_name_owner (proxy);
+  if (owner == NULL)
+    {
+      g_debug ("%s not provided by any service", interface_name);
+      goto out;
+    }
+
+  ret = g_dbus_proxy_get_cached_property (proxy, "version");
+  if (ret)
+    version = g_variant_get_uint32 (ret);
+
+  g_debug ("Got version %u for portal interface '%s'",
+           version, interface_name);
+
+out:
+  g_clear_object (&proxy);
+  g_clear_error (&error);
+  g_clear_pointer (&ret, g_variant_unref);
+  g_clear_pointer (&owner, g_free);
+
+  return version;
+}
+
 static char *
 get_portal_path (GDBusConnection  *connection,
                  const char       *kind,
index 6cac03c76308231dd6c30cc511ac50c186e172c7..f4ba489ba618ed6f16af244f75333657855cf515 100644 (file)
@@ -115,6 +115,8 @@ char *gtk_get_portal_request_path (GDBusConnection  *connection,
                                    char            **token);
 char *gtk_get_portal_session_path (GDBusConnection  *connection,
                                    char            **token);
+guint gtk_get_portal_interface_version (GDBusConnection *connection,
+                                        const char      *interface_name);
 
 #define PORTAL_BUS_NAME "org.freedesktop.portal.Desktop"
 #define PORTAL_OBJECT_PATH "/org/freedesktop/portal/desktop"